import { Button } from "@/src/components/ui/button"; import { MultiSelectKeyValues } from "@/src/features/scores/components/multi-select-key-values"; import { FlaskConical, List } from "lucide-react"; import { useRouter } from "next/router"; import { useState } from "react"; import { MarkdownJsonView } from "@/src/components/ui/MarkdownJsonView"; import { Dialog, DialogContent, DialogTrigger, } from "@/src/components/ui/dialog"; import { CreateExperimentsForm } from "@/src/features/experiments/components/CreateExperimentsForm"; import { useHasProjectAccess } from "@/src/features/rbac/utils/checkProjectAccess"; import { DatasetAnalytics } from "@/src/features/datasets/components/DatasetAnalytics"; import { TimeseriesChart } from "@/src/features/scores/components/TimeseriesChart"; import { isNumericDataType } from "@/src/features/scores/lib/helpers"; import { CompareViewAdapter } from "@/src/features/scores/adapters"; import { RESOURCE_METRICS } from "@/src/features/dashboard/lib/score-analytics-utils"; import { usePostHogClientCapture } from "@/src/features/posthog-analytics/usePostHogClientCapture"; import Page from "@/src/components/layouts/page"; import { SubHeaderLabel } from "@/src/components/layouts/header"; import { SidePanel, SidePanelContent, SidePanelHeader, SidePanelTitle, } from "@/src/components/ui/side-panel"; import useLocalStorage from "@/src/components/useLocalStorage"; import { getScoreDataTypeIcon } from "@/src/features/scores/lib/scoreColumns"; import { useDatasetRunsCompare } from "@/src/features/datasets/hooks/useDatasetRunsCompare"; import { useDatasetRunCompareChartData } from "@/src/features/datasets/hooks/useDatasetRunCompareChartData"; import { Skeleton } from "@/src/components/ui/skeleton"; import { DATASET_RUN_COMPARE_TABS, getDatasetRunCompareTabs, } from "@/src/features/navigation/utils/dataset-run-compare-tabs"; export default function DatasetCompare() { const router = useRouter(); const capture = usePostHogClientCapture(); const projectId = router.query.projectId as string; const datasetId = router.query.datasetId as string; const [isCreateExperimentDialogOpen, setIsCreateExperimentDialogOpen] = useState(false); const [selectedMetrics, setSelectedMetrics] = useLocalStorage( `${projectId}-dataset-compare-metrics`, RESOURCE_METRICS.map((metric) => metric.key), ); const hasExperimentWriteAccess = useHasProjectAccess({ projectId, scope: "promptExperiments:CUD", }); const { runIds, runs, dataset, handleExperimentSettled: handleExperimentSettledBase, setRunState, setLocalRuns, } = useDatasetRunsCompare(projectId, datasetId); const { chartDataMap, scoreAnalyticsOptions, scoreKeyToData, isLoading } = useDatasetRunCompareChartData(projectId, datasetId, runIds); const handleExperimentSettled = async (data?: { success: boolean; datasetId: string; runId: string; runName: string; }) => { setIsCreateExperimentDialogOpen(false); await handleExperimentSettledBase(data); }; return ( } options={runs.map((run) => ({ key: run.key, value: run.value, disabled: runIds?.includes(run.key) && runIds.length === 1, }))} values={runs.filter((run) => runIds?.includes(run.key))} onValueChange={(values, changedValueId, selectedValueKeys) => { if (values.length === 0) return; if (changedValueId) { if (selectedValueKeys?.has(changedValueId)) { capture("dataset_run:compare_run_added"); setRunState({ runs: [...(runIds ?? []), changedValueId], }); setLocalRuns([]); } else { capture("dataset_run:compare_run_removed"); setRunState({ runs: runIds?.filter((id) => id !== changedValueId) ?? [], }); setLocalRuns([]); } } }} /> ), }} >
{Boolean(selectedMetrics.length) && Boolean(chartDataMap?.size) ? (
{selectedMetrics.map((key) => { if (isLoading) { return ; } const adapter = new CompareViewAdapter(chartDataMap, key); const { chartData, chartLabels } = adapter.toChartData(); const scoreData = scoreKeyToData.get(key); if (!scoreData) return (
metric.key === key, )?.label ?? key } type="numeric" maxFractionDigits={ RESOURCE_METRICS.find( (metric) => metric.key === key, )?.maxFractionDigits } />
); return (
); })}
) : isLoading ? ( ) : ( {Boolean(chartDataMap?.size) ? "All charts hidden. Enable them in the Charts dropdown." : "Select more than one run to generate charts."} )}
{dataset.data?.name}
{dataset.data?.description ?? "No description"}
{dataset.data?.metadata && (
)}
); }